/*(C) Copyright

    This file is part of GastosMovil.
    
    GastosMovil is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    GastosMovil is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GastosMovil.  If not, see <http://www.gnu.org/licenses/>.
    
    Autor: Antonio Cristóbal Álvarez Abellán -> acabellan@gmail.com
    
    */

package deeloco.android.gastos.Movil.plus;

import java.util.Date;

import deeloco.android.gastos.Movil.plus.broadcast.avisoEstadoTelefono;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.util.Log;

/**
 * Clase que permite gestionar las alarmas meteorológicas
 * @author Antonio Cristóbal Álvarez Abellán
 *
 */

public class GestorNotificaciones {
	
	
	/**
	 * ATRIBUTOS
	 */
	
	private Context contexto;
	private int appWidgetId;
	private String TAG_LOG="GM+:AlarmaGestor";
	
	/**
	 * CONSTRUCTORES
	 */
	
	public GestorNotificaciones(Context contexto,int appWidgetId) {
		this.contexto=contexto;
		this.appWidgetId=appWidgetId;
	}
		
	/**
	 * GETTER Y SETTER
	 */
	
	public int getAppWidgetId() {
		return appWidgetId;
	}
	public void setAppWidgetId(int appWidgetId) {
		this.appWidgetId = appWidgetId;
	}
	


	/**
	 * MÉTODOS
	 */
	
	/**
	 * Carga los valores de los parámetros que necesita la clase para funcionar.
	 */
	public void setParam(Context contexto,int appWidgetId) {
		this.contexto=contexto;
		this.appWidgetId=appWidgetId;
	}
	

	/**
	 * Comprueba si las alarmas se cumplen y lanzar la alarma en el áres de notificación.
	 */
	public void comprobarNotificaciones()
	{
		
		//String trans=PreferenceManager.getDefaultSharedPreferences(context).getString("listTransparencia"+"_"+appWidgetId, "FF");
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		tarifas ts=new tarifas();
		int segLimite=0;
		int segConsumidos=0;
		ts.cargarTarifas();
		boolean alarmaSegundosActivada=true;
		boolean alarmaCosteActivada=true;
		int alarmaPorciento=0;
		int alarmaCoste=0;
		double gastoMes=0.0;
		
		/*Comprobar la alarma de tiempo*/
		alarmaSegundosActivada=vp.getPreferenciasActivaAlarmaTiempo();
		
		Log.d("GestorNotificaciones","Comprobando notificaciones");
		if (alarmaSegundosActivada)
		{
			for (int i=0;i<ts.numTarifas();i++)
			{
				Log.d("GestorNotificaciones","Comprobando para tarifa = "+ts.getTarifas().get(i).getNombre());
				if ((ts.getTarifas().get(i).getLimite()>0)||(ts.getTarifas().get(i).getLimiteDia()>0))
				{
					//Limites Mensuales
					if (ts.getTarifas().get(i).getLimite()>0)
					{
						
						segLimite=ts.getTarifas().get(i).getLimite()*60;
						segConsumidos = vp.recuperarPreferencesInt(ts.getTarifas().get(i).getNombre()+"_segConsumidosLimiteMes");
						alarmaPorciento=vp.getPreferenciasValorAlarmaTiempo();
						Log.d("GestorNotificaciones","toca = "+tocaNotificacionTiempo(segLimite, segConsumidos));
						if (excedePorCientoTiempo(segLimite, segConsumidos, alarmaPorciento)&&tocaNotificacionTiempo(segLimite, segConsumidos))
						{
							//LANZAR LA ALARMA
							String nombreTarifa=ts.getTarifas().get(i).getNombre();
							lanzarNotificacion(" "+nombreTarifa, contexto.getResources().getString(R.string.txt_Notif_pre) + vp.getPreferenciasValorAlarmaTiempo() + contexto.getResources().getString(R.string.txt_Notif_post));
						}
					}
					
					//Limites Diario
					if (ts.getTarifas().get(i).getLimiteDia()>0)
					{
						//HAbra que incluir el control de la notificación para un día.
					}
	
				}
			}
		}
		
		/*Comprobar la alarma de coste*/
		alarmaCosteActivada=vp.getPreferenciasActivaAlarmaCoste();
		if (alarmaCosteActivada)
		{
			
			try
			{
				gastoMes=Double.parseDouble(vp.recuperarPreferencesString("costeTotalMes"));
			}
			catch (Exception e)
			{
				gastoMes=0.0;
			}
	
			alarmaCoste=vp.getPreferenciasValorAlarmaCoste();
			Log.d("GestorNotificaciones"," Alarma Coste. toca = "+tocaNotificacionCoste(gastoMes, alarmaCoste));
			if (excedeCoste(gastoMes,alarmaCoste)&&tocaNotificacionCoste(gastoMes, alarmaCoste))
			{
				//LANZAR LA ALARMA
				lanzarNotificacion("", contexto.getResources().getString(R.string.txt_NotifCoste_pre) + alarmaCoste + FunGlobales.monedaLocal());
			}
		}
		
		
		/*Comprobar la alarma de permanencia */
		Date hoy=new Date();
        boolean alarmaNotificacionActivada=true;
        boolean hayPermanencia=true;
        hayPermanencia=vp.getPreferenciasHayPermanencia();
        alarmaNotificacionActivada=vp.getPreferenciasHayPermanencia();
		if (alarmaNotificacionActivada && hayPermanencia)
		{
			if (vp.getPreferenciasFechaFinPermanencia().compareTo(hoy)>0)
			{
				//LANZAR LA ALARMA
				lanzarNotificacion("", "Fin de la permanencia");
			}
		}
        
        
		
		
	}
	
	/**
	 * Lanza una notificación
	 * @param titulo
	 * @param texto
	 */
	public void lanzarNotificacion(String titulo,String texto)
	{
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		NotificationManager mNotificationManager = (NotificationManager) contexto.getSystemService(Context.NOTIFICATION_SERVICE);
		
		int icon = R.drawable.icon;
		CharSequence tickerText = contexto.getResources().getString(R.string.app_name_abrev);
		long when = System.currentTimeMillis();
		Notification notification = new Notification(icon, tickerText, when);
//		notification.flags |= Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
		notification.flags |= Notification.FLAG_AUTO_CANCEL;

		notification.sound = Uri.parse(vp.getPreferenciasRingtonePreference());
		
		CharSequence contentTitle = contexto.getResources().getString(R.string.app_name_abrev)+titulo;
		CharSequence contentText = texto;
		Intent notificationIntent = new Intent(contexto,Inicio.class);
		//launchIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

  		PendingIntent contentIntent = PendingIntent.getActivity(contexto, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
		notification.setLatestEventInfo(contexto, contentTitle, contentText,contentIntent);
		mNotificationManager.notify(appWidgetId, notification);
	}
	
	/**
	 * Dado un limite y un consumo, calcula si el consumido del límite es superior a un por ciento dado.
	 * @param limite
	 * @param consumido
	 * @param alarmaPorciento
	 * @return
	 */
	private boolean excedePorCientoTiempo(int limite,int consumido,int alarmaPorciento)
	{
		double porcientoConsumido=0;
		porcientoConsumido=((double)consumido/(double)limite)*100;
		return (porcientoConsumido>alarmaPorciento);
	}
	
	/**
	 * Dado un limite y un consumo, devuelve si la última llamada realizada es la primera que sobrepasa los limites
	 * @param limite
	 * @param consumido
	 * @return
	 */
	private boolean esLaPrimeraTiempo(int limite,int consumido)
	{
		boolean retorno=false;
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		int duracionUltimaLlamada=vp.recuperarPreferencesInt(avisoEstadoTelefono.PREF_DURACION);
		
		int consumidoAntes=consumido-duracionUltimaLlamada;
		if ((consumidoAntes<limite)&&(consumido>limite))
			retorno=true;
		Log.d(TAG_LOG,"Consumido-duracionUltima="+consumidoAntes+" Retorno="+retorno);
		return retorno;
	}
	
	/**
	 * 
	 * @param limite
	 * @param consumido
	 * @return
	 */
	private boolean tocaNotificacionTiempo(int limite,int consumido)
	{
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		boolean unaNotificacion;
		unaNotificacion=vp.getPreferenciasUnaNotificacionTiempo();
		boolean esPrimera=esLaPrimeraTiempo(limite, consumido);
		Log.d(TAG_LOG,"esPrimera="+esPrimera+" unaNotificacionTiempo="+unaNotificacion);
		if (unaNotificacion)
		{
			if (esPrimera)
				return true;
			else
				return false;
		}
		return true;
	}
	
	
	
	
	
	/**
	 * Dado un limite y un consumo, calcula si el consumido del límite es superior a un por ciento dado.
	 * @param limite
	 * @param consumido
	 * @param alarmaPorciento
	 * @return
	 */
	private boolean excedeCoste(double gastoMes,int costeLimite)
	{
		return (gastoMes>costeLimite);
	}
	
	
	/**
	 * Dado un limite y un consumo, devuelve si la última llamada realizada es la primera que sobrepasa los limites
	 * @param limite
	 * @param consumido
	 * @return
	 */
	private boolean esLaPrimeraCoste(double gastoMes,int costeLimite)
	{
		boolean retorno=false;
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		double costeUltimaLlamada=Double.parseDouble(vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_COSTE));
		double costeAntes=gastoMes-costeUltimaLlamada;
		if ((costeAntes<costeLimite)&&(gastoMes>costeLimite))
			retorno=true;
		Log.d(TAG_LOG,"gastoMes-costeUltimaLlamada="+costeAntes+" Retorno="+retorno);
		return retorno;
	}
	
	/**
	 * 
	 * @param limite
	 * @param consumido
	 * @return
	 */
	private boolean tocaNotificacionCoste(double gastoMes,int costeLimite)
	{
		ValoresPreferencias vp=new ValoresPreferencias(contexto);
		boolean unaNotificacion;
		unaNotificacion=vp.getPreferenciasUnaNotificacionCoste();
		boolean esPrimera=esLaPrimeraCoste(gastoMes, costeLimite);
		Log.d(TAG_LOG,"esPrimera="+esPrimera+" unaNotificacionCoste="+unaNotificacion);
		if (unaNotificacion)
		{
			if (esPrimera)
				return true;
			else
				return false;
		}
		return true;
	}
	
}
